package agents

import (
	"encoding/json"
	"fmt"
	"time"
	"webhook-agents/config"
	"webhook-agents/utils"
)

// KubeEventAlert represents the alert format from Kubernetes events
type KubeEventAlert struct {
	Type           string `json:"type"`
	Reason         string `json:"reason"`
	Message        string `json:"message"`
	FirstTimestamp string `json:"firstTimestamp"`
	LastTimestamp  string `json:"lastTimestamp"`
	Count          int    `json:"count"`
	Kind           string `json:"kind"`
	Name           string `json:"name"`
	Namespace      string `json:"namespace"`
	// 添加数据源标识字段
	DataSource string `json:"data_source,omitempty"`
}

// KubeeventerFlatEvent represents the flat event format from kubeeventer
type KubeeventerFlatEvent struct {
	EventType      string `json:"EventType"`
	EventKind      string `json:"EventKind"`
	EventReason    string `json:"EventReason"`
	EventTime      string `json:"EventTime"`
	EventMessage   string `json:"EventMessage"`
	EventObject    string `json:"EventObject"`
	EventNamespace string `json:"EventNamespace"`
	// 添加数据源标识字段
	DataSource string `json:"data_source,omitempty"`
}

// KubeEventProcessor Kubernetes事件处理器
type KubeEventProcessor struct {
	httpClient *utils.HTTPClient
	ditingURL  string
	endpoint   string
}

// NewKubeEventProcessor 创建新的Kubernetes事件处理器
func NewKubeEventProcessor() *KubeEventProcessor {
	// 获取Kubernetes事件端点配置
	endpointConfig, ok := config.Global.Diting.Endpoints["kube_event"]
	if !ok {
		// 如果配置不存在，使用默认值
		endpointConfig = config.EndpointConfig{
			Path:    "/alert/kube-event",
			Enabled: true,
		}
	}

	return &KubeEventProcessor{
		httpClient: utils.NewHTTPClient(30 * time.Second),
		ditingURL:  config.Global.Diting.URL,
		endpoint:   endpointConfig.Path,
	}
}

// ProcessAlert 处理Kubernetes事件并发送到谛听系统
func (k *KubeEventProcessor) ProcessAlert(alert interface{}) error {
	kubeEventAlert, ok := alert.(KubeEventAlert)
	if !ok {
		return fmt.Errorf("无效的事件类型")
	}

	// 添加数据源标识
	if kubeEventAlert.DataSource == "" {
		kubeEventAlert.DataSource = "kube-event"
	}

	// 构建完整URL
	url := fmt.Sprintf("%s%s", k.ditingURL, k.endpoint)

	// 打印将要发送到谛听系统的完整数据
	jsonData, err := json.MarshalIndent(kubeEventAlert, "", "  ")
	if err != nil {
		fmt.Printf("❌ 序列化发送数据失败: %v\n", err)
	} else {
		fmt.Printf("📤 准备发送到谛听系统的完整数据:\n%s\n", string(jsonData))
		fmt.Printf("   发送URL: %s\n", url)
	}

	// 发送POST请求到谛听系统
	if err := k.httpClient.PostJSON(url, kubeEventAlert); err != nil {
		return fmt.Errorf("发送事件到谛听系统失败: %v", err)
	}

	fmt.Printf("✅ Kubernetes事件已发送到谛听系统: %s (Name: %s, Namespace: %s)\n", url, kubeEventAlert.Name, kubeEventAlert.Namespace)
	return nil
}

// ProcessKubeeventerFlatEvent 处理kubeeventer扁平格式事件并发送到谛听系统
func (k *KubeEventProcessor) ProcessKubeeventerFlatEvent(event KubeeventerFlatEvent) error {
	// 解析命名空间信息
	namespace := "default"
	name := fmt.Sprintf("%s-event", event.EventKind)

	// 优先使用EventNamespace字段
	if event.EventNamespace != "" {
		namespace = event.EventNamespace
	}

	// 如果有EventObject字段，使用它作为对象名称
	if event.EventObject != "" {
		name = event.EventObject
	}

	// 转换为标准KubeEventAlert格式
	kubeEventAlert := KubeEventAlert{
		Type:           event.EventType,
		Reason:         event.EventReason,
		Message:        event.EventMessage,
		FirstTimestamp: event.EventTime,
		LastTimestamp:  event.EventTime,
		Count:          1,
		Kind:           event.EventKind,
		Name:           name,
		Namespace:      namespace,
		DataSource:     "kube-event",
	}

	// 构建完整URL
	url := fmt.Sprintf("%s%s", k.ditingURL, k.endpoint)

	// 打印将要发送到谛听系统的完整数据
	jsonData, err := json.MarshalIndent(kubeEventAlert, "", "  ")
	if err != nil {
		fmt.Printf("❌ 序列化发送数据失败: %v\n", err)
	} else {
		fmt.Printf("📤 准备发送到谛听系统的完整数据:\n%s\n", string(jsonData))
		fmt.Printf("   发送URL: %s\n", url)
	}

	// 发送POST请求到谛听系统
	if err := k.httpClient.PostJSON(url, kubeEventAlert); err != nil {
		return fmt.Errorf("发送事件到谛听系统失败: %v", err)
	}

	fmt.Printf("✅ Kubernetes事件已发送到谛听系统: %s (Type: %s, Reason: %s, Namespace: %s, Name: %s)\n", url, kubeEventAlert.Type, kubeEventAlert.Reason, kubeEventAlert.Namespace, kubeEventAlert.Name)
	return nil
}

// GetName 获取处理器名称
func (k *KubeEventProcessor) GetName() string {
	return "KubeEventProcessor"
}

// GetDescription 获取处理器描述
func (k *KubeEventProcessor) GetDescription() string {
	return "处理Kubernetes事件并转发到谛听系统"
}
